"""
引用
    概述:
        Python中的引用 指的是 地址值 即 变量在内存中的位置(十六进制的地址值)
    格式：
        id(变量名)  可以获取变量的十进制地址值
        hex()      将十进制转换成十六进制
    细节:
        1. Python 中只有引用传递， 即: 我们以前看到的所有的赋值动作，都是把 地址值拷贝 给变量
        2. 区分 可变 和 不可变 类型的依据：在不改变地址的情况下，是否可以修改变量值
            可变: 堆中的对象可以被修改     list   dict   set
            不可变：堆中的对象不可以被修改
                不可变容器 tuple  str
                不可变常用类型  int float bool


"""
list1 = [1,2,3,4,5]

e = enumerate(list1) # 对象地址
print(e) # 十六进制 0x000001C3D0D2B470

print(id(e))  # 十进制
# 把十进制转换成十六进制
print(hex(id(e))) # 0x1c3d0d2b470

a = 15
print(hex(id(e))) # 十六进制地址
print('-'*30)

print(f'list1的地址是:{hex(id(list1))}')
print(f'list1[0]的地址是:{hex(id(list1[1]))}')
print(f'2的内存地址是:{hex(id(2))}')
b = 2
print(f'b的内存地址是:{hex(id(b))}')

print('-' * 30)

# 字符串是不可变类型
# str1 = '聂如风'
str1 = ' abc '

print(f'字符串str1的地址是:{hex(id(str1))},字符串长度是:{len(str1)}')

# str1 = '聂'
str2 = str1.strip()

print(f'字符串str1修改之后的地址是:{hex(id(str2))},字符串长度是：{len(str2)}')

print('=' * 30)
# 列表是可变类型
list2 = [1,2,3,4,5,6]
print(f'list2的地址是:{hex(id(list2))},内容是:{list2}')

list2.pop()
print(f'list2修改后的地址是:{hex(id(list2))},内容是:{list2}')




